//给定一个数组 nums，编写一个函数将所有 0 移动到数组的末尾，同时保持非零元素的相对顺序。 
//
// 示例: 
//
// 输入: [0,1,0,3,12]
//输出: [1,3,12,0,0] 
//
// 说明: 
//
// 
// 必须在原数组上操作，不能拷贝额外的数组。 
// 尽量减少操作次数。 
// 
// Related Topics 数组 双指针 
// 👍 1325 👎 0

package leetcode.editor.cn;
public class P283MoveZeroes {
    public static void main(String[] args) {
        Solution solution = new P283MoveZeroes().new Solution();
        int[] nums = new int[]{0,1,0,3,12};
        solution.moveZeroes(nums);
        int[] nums2 = new int[]{1,3,12,0,0};
        solution.moveZeroes(nums2);
        int[] nums3 = new int[]{1,3};
        solution.moveZeroes(nums3);
        System.out.println("end");
    }
    //leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    // 个人
    public void moveZeroes2(int[] nums) {
        int zeroIndex = -1;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == 0) {
                if (zeroIndex == -1) {
                    zeroIndex = i;
                }
                continue;
            }
            if (i != zeroIndex && zeroIndex != -1) {
                int temp = nums[zeroIndex];
                nums[zeroIndex] = nums[i];
                nums[i] = temp;
                zeroIndex++;
            }
        }
    }

    // 优化
    public void moveZeroes(int[] nums) {
        int zeroIndex = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != 0) {
                nums[zeroIndex] = nums[i];
                zeroIndex++;
            }
        }
        for (;zeroIndex < nums.length; zeroIndex++) {
            nums[zeroIndex] = 0;
        }
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}